#ifndef __BINARYTREE_H_
#define __BINARYTREE_H_
#include<LinkQueue.h>
#include<iostream>

class BinaryTree
{
public:

    using ElementType = int;

    BinaryTree();

    void Insert(const ElementType& element);
    
    void Remove(const ElementType& element);
    
    ElementType*FindByElement(const ElementType& element);
    
    void show();

private:

    struct Node                 //树的结点
    {
        ElementType data;   //数据域
        Node* left;//左孩子
        Node* right;//右孩子
        
        Node(const ElementType &element):data(element)
        {
            left = nullptr;
            right = nullptr;
        }

    };

    

    Node* InsertNode(Node* node,const ElementType& element);

    void PrevTravel(Node* node);  
    void MidTravel(Node* node);
    void PostTravel(Node* node);

    void HeightTravel(Node* node);

    Node* RemoveByElement(Node* node,const ElementType& element);

    Node* GetMinNode(Node* node);

    Node* RotateRight(Node*node);
    Node* RotateLeft(Node* node);
    Node* RotateRightLeft(Node* node);
    Node* RotateLeftRight(Node* node);
   
    ElementType* FindNode(Node*node,const ElementType&element);



    int GetNodeHeight(Node*node);
    int LRDevition(Node*node);
  
    Node* root;

};
























































#endif